package client;

import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import be.ipl.finito.domaine.Case;
import be.ipl.finito.domaine.Jeton;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.usecases.GestionJeton;
import be.ipl.finito.usecases.GestionJoueur;
import be.ipl.finito.usecases.GestionPartie;

public class NewTest {
	
	private GestionJoueur gestionJoueur;
	private GestionPartie gestionPartie;
	private GestionJeton gestionJeton;
	
	private Partie partie;
	
	private String loginJ1 = "anas";
	private String nomJ1 = "Lamrini";
	private String prenomJ1 = "Anas";
	private String passwordJ1 = "1111";
	private String emailJ1 = "anas@lamrini.fr";
	
	private String loginJ2 = "gab";
	private String nomJ2 = "Kaplan";
	private String prenomJ2 = "Gabriel";
	private String passwordJ2 = "1111";
	private String emailJ2 = "gab@ipl.fr";
	
	private String loginJ3 = "brique";
	private String nomJ3 = "Poniatowski";
	private String prenomJ3 = "Fred";
	private String passwordJ3 = "1111";
	private String emailJ3 = "fred@ciment.fr";
	
	private String loginJ4 = "Arthur";
	private String nomJ4 = "Maniet";
	private String prenomJ4 = "Arthur";
	private String passwordJ4 = "1111";
	private String emailJ4 = "blabla@ipl.fr";
	
	

	@BeforeClass
	public void init(){
		Context ctx;
		try {
			ctx = new InitialContext();
			gestionJoueur = (GestionJoueur) ctx.lookup("ejb:Finito_EAR/Finito_EJB/GestionJoueurImpl!be.ipl.finito.usecases.GestionJoueur");
			gestionPartie = (GestionPartie) ctx.lookup("ejb:Finito_EAR/Finito_EJB/GestionPartieImpl!be.ipl.finito.usecases.GestionPartie");
			gestionJeton = (GestionJeton) ctx.lookup("ejb:Finito_EAR/Finito_EJB/GestionJetonImpl!be.ipl.finito.usecases.GestionJeton");
			gestionJeton.initialiserJeton();
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void testInscrireJoueur(){		
		Assert.assertNotNull(gestionJoueur.enregistrer(loginJ1, passwordJ1, nomJ1, prenomJ1, emailJ1));
		Assert.assertNotNull(gestionJoueur.enregistrer(loginJ2, passwordJ2, nomJ2, prenomJ2, emailJ2));
		Assert.assertNotNull(gestionJoueur.enregistrer(loginJ3, passwordJ3, nomJ3, prenomJ3, emailJ3));
		Assert.assertNull(gestionJoueur.enregistrer(loginJ1, passwordJ1, nomJ1, prenomJ1, emailJ1));
		Assert.assertNotNull(gestionJoueur.enregistrer(loginJ4, passwordJ4, nomJ4, prenomJ4, emailJ4));

	}
	
	@Test(dependsOnMethods={"testInscrireJoueur"})
	public void testSeConnecter(){
		Assert.assertNotNull(gestionJoueur.seConnecter(loginJ1, passwordJ1));
		Assert.assertNull(gestionJoueur.seConnecter(loginJ1, "1234"));
		Assert.assertNull(gestionJoueur.seConnecter("jim", passwordJ1));
	}
	
	@Test(dependsOnMethods={"testSeConnecter"})
	public void testCreerPartie(){
		partie = gestionPartie.creerPartie(loginJ1);
		Assert.assertNotNull(partie);
		Assert.assertEquals(gestionPartie.getJoueursDunePartie(partie.getIdPartie()).get(0).getLogin(), loginJ1);
	}
	
	@Test(dependsOnMethods={"testCreerPartie"})
	public void testRejoindrePartie(){
		partie = gestionPartie.rejoindreLaPartie(partie.getIdPartie(), loginJ2);
		Assert.assertNotNull(partie);
		Assert.assertNull(gestionPartie.rejoindreLaPartie(partie.getIdPartie(), "existePas"));
		Assert.assertEquals(gestionPartie.getJoueursDunePartie(partie.getIdPartie()).get(0).getLogin(), loginJ1);
		Assert.assertEquals(gestionPartie.getJoueursDunePartie(partie.getIdPartie()).get(1).getLogin(), loginJ2);
		Assert.assertEquals(partie.getGrilles().size(), 2);
	}
	
	@Test(dependsOnMethods={"testRejoindrePartie"})
	public void testListerPartieEnAttente(){
			List<Partie> parties = gestionPartie.getPartiesEnAttenteDeJoueur();
			Assert.assertTrue(parties.size() == 1);
	}
	
	@Test(dependsOnMethods={"testListerPartieEnAttente"})
	public void testRejoindrePartie2(){
		partie = gestionPartie.rejoindreLaPartie(partie.getIdPartie(), loginJ3);
		Assert.assertNotNull(partie);
		Assert.assertEquals(gestionPartie.getJoueursDunePartie(partie.getIdPartie()).get(0).getLogin(), loginJ1);
		Assert.assertEquals(gestionPartie.getJoueursDunePartie(partie.getIdPartie()).get(1).getLogin(), loginJ2);
		Assert.assertEquals(gestionPartie.getJoueursDunePartie(partie.getIdPartie()).get(2).getLogin(), loginJ3);
		Assert.assertEquals(partie.getGrilles().size(), 3);
	}

	@Test(dependsOnMethods={"testRejoindrePartie2"})
	public void testListerPartieEnAttente2(){
		List<Partie> parties = gestionPartie.getPartiesEnAttenteDeJoueur();
		Assert.assertTrue(parties.size() == 0);
	}
	
	@Test(dependsOnMethods={"testListerPartieEnAttente2"})
	public void testRejoindrePartieEnCours(){
		partie = gestionPartie.rejoindreLaPartie(partie.getIdPartie(),loginJ4);
		Assert.assertNotNull(partie);
		Assert.assertEquals(partie.getGrilles().size(), 3);
	}
	
	
//	@Test(dependsOnMethods={"testRejoindrePartieEnCours"})
//	public void testLancerDe(){
//		List<Jeton> jeton = new ArrayList<Jeton>();
//		jeton.add(gestionPartie.tirageJeton(partie.getIdPartie()));
//		jeton.add(gestionPartie.tirageJeton(partie.getIdPartie()));
//		jeton.add(gestionPartie.tirageJeton(partie.getIdPartie()));
//		
//		int de = gestionPartie.lancerDe(partie.getIdPartie());
//		gestionPartie.placerJeton(partie.getIdPartie(), partie.getGrilles().get(0), new Case(,de),  )
//	}
}